package com.dcbeida.callback;

import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.dcbeida.bean.ResultAllModel;
import com.dcbeida.bean.Result_Api;
import com.google.gson.Gson;

import org.json.JSONObject;

import java.lang.reflect.Type;

import dc.medicine.com.okhttplib.OkHttpUtils;
import dc.medicine.com.okhttplib.request.BaseRequest;


public abstract class JsonCallback<T> extends EncryptCallback<T> {

    private Class<T> clazz;
    private Type type;

    private ResultAllModel allModel;


    public JsonCallback(Class<T> clazz) {
        this.clazz = clazz;
    }

    public JsonCallback(Type type) {
        this.type = type;
    }

    public Type getType() {
        return type;
    }

    private BaseRequest request;

    @Override
    public void onBefore(BaseRequest request) {
        super.onBefore(request);
        this.request = request;
    }

    //该方法是子线程处理，不能做ui相关的工作
    @Override
    public T parseNetworkResponse(String response) throws Exception {
        String responseData = response;
        String service = request.getParams().appsParmas.get("service");
        Log.d("JsonCallback", "service=" + service + "  ---->result:" + responseData);

        if (TextUtils.isEmpty(responseData)) return null;

        /**
         * 一般来说，服务器返回的响应码都包含 code，msg，data 三部分，在此根据自己的业务需要完成相应的逻辑判断
         * 以下只是一个示例，具体业务具体实现
         */
        JSONObject jsonObject = new JSONObject(responseData);
        final String msg = jsonObject.optString("msg", "");
        final int code = jsonObject.optInt("code", 0);
        final String data = jsonObject.optString("data", "");


        switch (code) {
            case 1:
                /**
                 * code = 0 代表成功，默认实现了Gson解析成相应的实体Bean返回，可以自己替换成fastjson等
                 * 对于返回参数，先支持 String，然后优先支持class类型的字节码，最后支持type类型的参数
                 */
                if (clazz == Result_Api.class)
                    return new Gson().fromJson(jsonObject.toString(), clazz);
                if (clazz != null) return new Gson().fromJson(data, clazz);
                if (type != null) return new Gson().fromJson(data, type);
                break;
//            default:
//                throw new IllegalStateException("错误代码：" + code + "，错误信息：" + msg);

        }
        //如果要更新UI，需要使用handler，可以如下方式实现，也可以自己写handler
        OkHttpUtils.getInstance().getDelivery().post(new Runnable() {
            @Override
            public void run() {
                showError(msg,code,data);
            }
        });

        return null;
    }

    public abstract void showError(String message,int code,String data);
}
